Вы должны завершить n процессов. Все номера процессов уникальны и принимают значения от 1 до n.
Вам заданы две вещи:
·
Порядок, в котором процессы будут вызываться на выполнение.
·
Идеальный порядок, в котором все процессы должны были быть выполнены.
Если процесс, вызванный на
выполнение, не может быть выполнен (не подходит под идеальный порядок), то его
ставят в конец очереди вызова на выполнение.
Продемонстрируем это на
примере. Допустим, имеются 3 процесса с порядком вызова 3 – 2 – 1 и идеальным порядком 1 – 3 – 2. Процесс номер 3 сможет быть выполнен только после
завершения процесса 1, процесс 2 сможет быть выполнен только
после выполнения процесса 3.
·
Итерация #1: Согласно идеальному порядку первым на выполнение
должен поступить процесс #1, однако на выполнение поступает
процесс 3. Порядок на выполнение изменяется: первый элемент перемещается в
конец. Изменение положения элемента занимает 1 единицу времени. Новый порядок на выполнение
примет вид: 2 – 1 – 3. Время на шаг #1: 1.
·
Итерация #2: Согласно идеальному порядку первым на выполнение
должен поступить процесс #1, однако на выполнение поступает процесс 2. Порядок на выполнение
изменяется: первый элемент перемещается в конец. Новый порядок на выполнение
примет вид: 1 – 3 – 2. Время на шаг #2: 1.
·
Итерация #3: Первый элемент в порядке на выполнение совпадает с
первым элементом в идеальном порядке. Процесс #1 выполняется и
удаляется из очереди. Время на шаг #3: 1.
·
Итерация #4: Поскольку снова первые элементы в порядке выполнения
и в идеальном порядке совпадают, то выполняем процесс 3. Время на
шаг #4: 1.
·
Итерация #5: Последние оставшиеся элементы в обоих порядках
идентичны, выполняем процесс 2. Время на шаг #5: 1.
Общее
время: 5 единиц.
Выполнение процесса
занимает 1 единицу времени. Изменение позиции
занимает 1 единицу времени.
Вход.
Первая строка содержит количество процессов n (1 ≤ n ≤ 100). Вторая строка содержит порядок в котором процессы
будут вызываться на выполнение. Третья строка содержит идеальный порядок, в
котором процессы должны выполняться.
Выход.
Выведите общее время, необходимое для выполнения всей очереди процессов.
Пример входа |
Пример выхода |
3 3 2 1 1 3 2 |
5 |
очередь
Анализ алгоритма
Объявим две
очереди:
·
order содержит
порядок процессов,
в котором они будут вызываться на выполнение.
·
ideal содержит идеальный
порядок, в котором процессы должны быть выполнены.
queue<int> order, ideal;
Далее следует
промоделировать работу очередей:
·
Если номер процесса в голове очереди
выполнения совпадает с номером процесса в голове идеальной очереди, то
выполняем процесс и удаляем его из обеих очередей.
·
Иначе следует извлечь процесс из головы
очереди на выполнение и поставить его в конец этой очереди.
Пример
Промоделируем выполнение
трех процессов из
примера.
Реализация алгоритма
Объявим две
очереди:
·
order содержит
порядок процессов,
в котором они будут вызываться на выполнение.
·
ideal содержит идеальный
порядок, в котором процессы должны быть выполнены.
queue<int> order, ideal;
Читаем количество процессов n. Читаем порядки order и ideal.
scanf("%d", &n);
for (i = 0;
i < n; i++)
{
scanf("%d", &x);
order.push(x);
}
for (i = 0;
i < n; i++)
{
scanf("%d", &x);
ideal.push(x);
}
В переменной res подсчитываем
время выполнения процессов.
res = 0;
Продолжаем, пока не будут обработаны все процессы.
while
(!ideal.empty())
{
res++;
Если номер процесса в голове очереди выполнения совпадает
с номером процесса в голове идеальной очереди, то выполняем процесс и удаляем
его из обеих очередей.
if (order.front() == ideal.front())
{
order.pop();
ideal.pop();
}
else
{
Иначе следует извлечь процесс из головы очереди на
выполнение и поставить его в конец этой очереди.
x =
order.front(); order.pop();
order.push(x);
}
}
Выводим ответ.
printf("%d\n", res);
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner con = new Scanner(System.in);
int n = con.nextInt();
Queue<Integer> order = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
{
int x = con.nextInt();
order.add(x);
}
Queue<Integer> ideal = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
{
int x = con.nextInt();
ideal.add(x);
}
int res = 0;
while (!ideal.isEmpty())
{
res++;
if (order.peek() == ideal.peek())
{
order.poll();
ideal.poll();
}
else
{
int x = order.poll();
order.add(x);
}
}
System.out.println(res);
con.close();
}
}